package titiritero.vista;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.ImageObserver;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;

import javax.swing.ImageIcon;

import titiritero.Dibujable;
import titiritero.Posicionable;
import titiritero.SuperficieDeDibujo;

public class ImagenAnimada implements Dibujable {

	private Image[] frames;
	private int numTotalDeFrames;
	private int actualFrame;
	private Posicionable posicionable;
	
	public ImagenAnimada (String nombArchivo, int w, int h) {
		cargarImagen(nombArchivo, w, h);
	}
	
	public int getNumTotalDeFrames() {
		return numTotalDeFrames;
	}
	
	public void setFrame(int f) {
		actualFrame = f;
	}

	public int getFrame() {
		return actualFrame;
	}
	
	public void nextFrame() {
		if(actualFrame<numTotalDeFrames-1)
			actualFrame++;
		else
			actualFrame=0;
	}

	void dividirImagenEnFrames (Image src, int w, int h) {
		int spriteW = w;
		int spriteH = h;

		int imagenesALoAncho = src.getWidth(null) / spriteW;
		int imagenesALoAlto = src.getHeight(null) / spriteH;

		numTotalDeFrames = imagenesALoAncho * imagenesALoAlto;

		actualFrame=0;
		frames = new Image[numTotalDeFrames];

		int idx = 0;

		if(numTotalDeFrames>1)
			for(int j=0; j<imagenesALoAlto; j++)
				for(int i=0; i<imagenesALoAncho; i++) {
					frames[idx] = getSubImage(src, spriteW*i, spriteH*j, 
							spriteW, spriteH);
					idx++;
				}
		else
			frames[actualFrame] = src;
	}

	private Image getSubImage (Image src, int x, int y, int w, int h) {
		int[] pix = new int[w*h];
		try {
			PixelGrabber pgObj = new PixelGrabber( src, x, y, w, h, pix, 0, w );

			if( pgObj.grabPixels() && 
					((pgObj.getStatus() & ImageObserver.ALLBITS ) != 0 )) {}

		} catch( InterruptedException e ) {
			e.printStackTrace();
		}

		Image dest = Toolkit.getDefaultToolkit().createImage( new MemoryImageSource( 
				w, h, pix, 0, w ));
		return dest;
	}

	public void dibujar(Graphics g) {
		if(frames!=null) {
			g.drawImage(this.frames[actualFrame], this.posicionable.getX(), this.posicionable.getY(), null);
		}
	}
	
	public void dibujar(SuperficieDeDibujo superficeDeDibujo) {
		if(frames!=null) {
			Graphics grafico = ((Ventana)superficeDeDibujo).getGrafico();
			grafico.drawImage(this.frames[actualFrame], this.posicionable.getX(), this.posicionable.getY(), null);
		}
	}

	public void cargarImagen(String nombreArchivoImagen, int w, int h) {
		Image imagen = null;
		try {
			if(nombreArchivoImagen != null) {
				imagen = Toolkit.getDefaultToolkit().createImage(nombreArchivoImagen);
				new ImageIcon(imagen); //se obliga a cargar la imagen para que funcione getWidth(null) y getHeight(null)
			}
			else
				imagen = null;
		} catch(Exception ex) {
			ex.printStackTrace();
		}

		if(imagen!=null)
		dividirImagenEnFrames(imagen, w, h);
	}

	public Posicionable getPosicionable() {
		return posicionable;
	}

	public void setPosicionable(Posicionable posicionable) {
		this.posicionable = posicionable;
	}
}
